C¡c b÷îc c i °t mët ch÷ìng tr¼nh sû döng

Một phần của tài liệu Phương pháp quy hoạch động giải một số bài toán tối ưu (Trang 28)

ph¡p quy ho¤ch ëng

º c i °t mët ch÷ìng tr¼nh sû döng quy ho¤ch ëng c¦n thüc hi»n c¡c b÷îc sau:

B÷îc 1: Gi£i t§t c£ c¡c b i to¡n cì sð (thæng th÷íng r§t d¹), l÷u c¡c líi gi£i v o b£ng ph÷ìng ¡n.

B÷îc 2: Dòng cæng thùc truy hçi phèi hñp nhúng líi gi£i cõa nhúng b i to¡n nhä ¢ l÷u trong b£ng ph÷ìng ¡n º t¼m líi gi£i cõa nhúng b i to¡n lîn hìn v  l÷u chóng v o b£ng ph÷ìng ¡n. Cho tîi khi b i to¡n ban ¦u t¼m ÷ñc líi gi£i.

B÷îc 3: Düa v o b£ng ph÷ìng ¡n, truy v¸t t¼m ra nghi»m tèi ÷u. Cho ¸n nay, v¨n ch÷a bi¸t mët c¡ch ch½nh x¡c nhúng b i to¡n n o câ thº gi£i hi»u qu£ b¬ng quy ho¤ch ëng. Tuy nhi¶n º bi¸t ÷ñc b i to¡n câ thº gi£i b¬ng quy ho¤ch ëng hay khæng, ta câ thº tü °t c¥u häi: "Mët nghi»m tèi ÷u cõa b i to¡n lîn câ ph£i l  sü phèi hñp c¡c nghi»m tèi ÷u cõa c¡c b i to¡n con hay khæng ?" v  Li»u câ thº n o l÷u trú ÷ñc nghi»m c¡c b i to¡n con d÷îi mët h¼nh thùc n o â º phèi hñp t¼m ÷ñc nghi»m b i to¡n lîn".

Ch֓ng 2

MËT SÈ B€I TON QUY HO„CH ËNG

2.1 D¢y con ìn i»u t«ng d i nh§t

B i to¡n: Cho d¢y sè nguy¶nC = c[1..m].(m ≤ 5000,−10000 ≤c[k] ≤

10000). Mët d¢y con cõa C l  mët c¡ch chån ra trong C mët sè ph¦n tû giú nguy¶n thù tü. Nh÷ vªy C câ 2m d¢y con.

Y¶u c¦u: T¼m d¢y con ìn i»u t«ng cõa C câ ë d i lîn nh§t.

V½ dö 2.1. C = (1, 2, 3, 4, 9, 11, 7, 5, 12, 6). D¢y con ìn i»u t«ng d i nh§t l : (1, 2, 3, 4, 9, 11, 12).

Input: file v«n b£n QU Y.IN P ∗ Dáng 1: Chùa sè m.

∗ Chùa m sè c[1], c[2], . . . , c[m] c¡ch nhau ½t nh§t mët d§u c¡ch. Output: file v«n b£n QU Y.OU T

∗ C¡c dáng ti¸p: Ghi d¢y con t¼m ÷ñc v  ch¿ sè nhúng ph¦n tû ÷ñc chån v o d¢y con â.

H¼nh 2.1:

C¡ch gi£i:

Bê sung v o C hai ph¦n tû: c[0] = −∞ v  c[m+ 1] = +∞. Khi â d¢y con ìn i»u t«ng d i nh§t ch­c ch­n s³ b­t ¦u tø c[0] v  k¸t thóc ð

c[m+ 1].

Vîi ∀j : 0 ≤ j ≤ m + 1. Ta s³ t½nh L[j] = ë d i d¢y con ìn i»u t«ng d i nh§t b­t ¦u t¤i a[j].

Cì sð quy ho¤ch ëng (b i to¡n nhä nh§t): L[m+ 1] = ë d i d¢y con ìn i»u t«ng d i nh§t b­t ¦u t¤i c[m+ 1] = +∞. D¢y con n y ch¿ gçm méi mët ph¦n tû (+∞) n¶n L[m+ 1] = 1.

Cæng thùc truy hçi: Gi£ sû vîi j ch¤y tø m v· 0, ta c¦n t½nh L[j]: ë d i d¢y con t«ng d i nh§t b­t ¦u t¤i a[j]. L[j] ÷ñc t½nh trong i·u ki»n L[j+ 1..m+ 1] ¢ bi¸t:

D¢y con ìn i»u t«ng d i nh§t b­t ¦u tø c[j] s³ ÷ñc th nh lªp b¬ng c¡ch l§y c[j] gh²p v o ¦u mët trong sè nhúng d¢y con ìn i»u t«ng d i nh§t b­t ¦u t¤i và tr½ c[k] ùng sau c[j]. Ta s³ chån d¢y n o º gh²p c[j] v o ¦u? T§t nhi¶n l  ch¿ ÷ñc gh²p c[j] v o ¦u nhúng d¢y con b­t ¦u t¤i c[k] n o â lîn hìn c[j] (º £m b£o t½nh t«ng)

v  d¾ nhi¶n ta s³ chån d¢y d i nh§t º gh²p c[j] v o ¦u (º £m b£o t½nh d i nh§t). Vªy L[j] ÷ñc t½nh nh÷ sau: X²t t§t c£ c¡c ch¿ sè j trong kho£ng tø j + 1 ¸n m+ 1 m  c[k] > c[j], chån ra ch¿ sè kmax

câ L[kmax] lîn nh§t. °t L[j] := L[kmax] + 1 :.

L[j] = max

j<k≤m−1

c[j]<c[k]

L[k] + 1

. Truy v¸t: T¤i b÷îc x¥y düng d¢y L, méi khi g¡n L[j] := L[kmax] + 1, ta °t T[j] = kmax. º l÷u l¤i r¬ng: D¢y con d i nh§t b­t ¦u t¤i

c[j] s³ câ ph¦n tû thù hai k¸ ti¸p l  c[kmax].

Sau khi t½nh xong hay d¢y L v  T, ta b­t ¦u tø T[0].

H¼nh 2.2: T½nh to¡n v  truy v¸t

. T[0] ch½nh l  ph¦n tû ¦u ti¶n ÷ñc chån

. T[T[0]] l  ph¦n tû thù hai ÷ñc chån

. T[T[T[0]]] l  ph¦n tû thù ba ÷ñc chån Qu¡ tr¼nh truy v¸t câ thº di¹n t£ nh÷ sau:

j := T[0];

while j <> m + 1 do

begin j := T[j];

end;

2.2 Bi¸n êi x¥u

B i to¡n: Cho x¥u kþ tü Y, x²t 3 ph²p bi¸n êi bi¸n:

1. Insert(i, C): i l  sè, C l  kþ tü: Ph²p Insert ch±n kþ tü C v o sau và tr½ i cõa x¥u Y.

2. Replace(i, C): i l  sè, C l  kþ tü: Ph²p Replace thay kþ tü t¤i và tr½ i cõa x¥u Y bði kþ tü C.

3. Delete(i): i l  sè, Ph²p Delete xo¡ kþ tü t¤i và tr½ i cõa x¥u Y. Y¶u c¦u: Cho tr÷îc x¥u X, h¢y t¼m mët sè ½t nh§t c¡c ph²p bi¸n êi tr¶n º bi¸n x¥u Y th nh x¥u X.

Input: file v«n b£n XAU.INP

∗ Dáng 1: Chùa x¥u Y, (ë d i ≤100).

∗ Dáng 2: Chùa x¥u X, (ë d i ≤100).

Output: file v«n b£n XAU.OUT ghi c¡c ph²p bi¸n êi c¦n thüc hi»n v  x¥u X t¤i méi ph²p bi¸n êi.

C¡ch gi£i:

èi vîi x¥u kþ tü th¼ vi»c xo¡, ch±n s³ l m cho c¡c ph¦n tû ph½a sau và tr½ bi¸n êi bà ¡nh ch¿ sè l¤i, g¥y khâ kh«n cho vi»c qu£n lþ và tr½. º kh­c phöc i·u n y, ta s³ t¼m mët thù tü bi¸n êi tho£ m¢n: Ph²p

H¼nh 2.3:

bi¸n êi t¤i và tr½ i b­t buëc ph£i thüc hi»n sau c¡c ph²p bi¸n êi t¤i và tr½ i+ 1, i+ 2, . . .

V½ dö 2.2. Z =0 M N P Q0;

Insert(0, E) sau â Delete(4) cho ra Z =0 EM N P Q0. C¡ch n y khæng tu¥n thõ nguy¶n t­c.

Delete(3) sau â Insert(0, E) cho ra Z =0 EM N Q0. C¡ch n y tu¥n thõ nguy¶n t­c · ra. Nâi tâm l¤i ta s³ t¼m mët d¢y bi¸n êi câ và tr½ thüc hi»n gi£m d¦n.

Cæng thùc truy hçi: Gi£ sû m l  ë d i x¥u Z v  n l  ë d i x¥u V. Gåi F[i, j] l  sè ph²p bi¸n êi tèi thiºu º bi¸n x¥u gçm i kþ tü ¦u cõa x¥u Z : Z[1..i] th nh x¥u gçm j kþ tü ¦u cõa x¥u V : V[1..j]. Quan s¡t hai d¢y Z v  V:

Ta nhªn th§y:

H¼nh 2.4:

1] th nh V[1..n − 1]. Tùc l  trong tr÷íng hñp n y: F[m, n] =

F[m−1, n−1].

H¼nh 2.5:

∗ N¸u Z[m] 6= X[n] th¼ t¤i và tr½ Z[m] ta câ thº sû döng mët trong 3 ph²p bi¸n êi:

. Ho°c ch±n v o sau và tr½ m cõa Z, mët kþ tü óng b¬ng V n

H¼nh 2.6:

Th¼ khi â F[m, n] s³ b¬ng 1 ph²p thay vøa rçi cëng vîi sè ph²p bi¸n êi bi¸n d¢y Z[1..m − 1] th nh d¢y V[1..n − 1]:

H¼nh 2.7: . Ho°c xo¡ và tr½ thù m cõa Z:

Th¼ khi â F[m, n]s³ b¬ng 1 ph²p xo¡ vøa rçi cëng vîi sè ph²p bi¸n êi bi¸n d¢y Z[1..m−1] th nh d¢y V[1..n] : F[m, n] = 1 +F[m−1, n].

V¼ F[m, n] ph£i l  nhä nh§t câ thº, n¶n trong tr÷íng hñp Z[m] 6=

V[n] th¼:

F[m, n] = min (F[m, n−1], F[m−1, n−1], F[m−1, n]) + 1. Ta x¥y düng xong cæng thùc truy hçi:

F[m, n] =      F[m −1, n−1] Zm = Vn min (F[m, n −1], F[m −1, n−1], F[m−1, n]) + 1, Zm 6= Vn. Cì sð quy ho¤ch ëng:

∗ F[0, j] l  sè ph²p bi¸n êi bi¸n x¥u réng th nh x¥u gçm j kþ tü ¦u cõa F. Nâ c¦n tèi thiºu j ph²p ch±n: F[0, j] = j.

∗ F[i,0] l  sè ph²p bi¸n êi bi¸n x¥u gçm i kþ tü ¦u cõa S th nh x¥u réng, nâ c¦n tèi thiºu i ph²p xo¡: F[i,0] = i.

Vªy ¦u ti¶n b£ng ph÷ìng ¡n F (cï[0..m,0..n]) ÷ñc khði t¤o h ng 0 v  cët 0 l  cì sð quy ho¤ch ëng. Tø â dòng cæng thùc truy hçi t½nh ra t§t c£ c¡c ph¦n tû b£ng B.

Sau khi t½nh xong th¼ F[m, n] cho ta bi¸t sè ph²p bi¸n êi tèi thiºu. Truy v¸t: N¸u Z[m] = V[n] th¼ ch¿ vi»c x²t ti¸p F[m−1, n−1]. N¸u khæng, x²t 3 tr÷íng hñp:

∗ N¸u F[m, n] = F[m, n−1] + 1 th¼ ph²p bi¸n êi ¦u ti¶n ÷ñc sû döng l : Insert(m, V[n]).

∗ N¸u F[m, n] = F[m−1, n−1] + 1 th¼ ph²p bi¸n êi ¦u ti¶n ÷ñc sû döng l : Replace(m, V[n]).

∗ N uF[m, n] = F[m−1, n] + 1, th¼ ph²p bi¸n êi ¦u ti¶n ÷ñc sû döng l : Delete(m).

÷a v· b i to¡n vîi m, n nhä hìn truy v¸t ti¸p cho tîi khi v· F[0,0].

V½ dö 2.3. Z =0 M N P Q0; V =0 EM N Q0 b£ng ph÷ìng ¡n l : F 0 1 2 3 4 0 0 1 2 3 4 1 1 1 1 2 3 2 2 2 2 1 2 3 3 3 3 2 2 4 4 4 4 3 2

L÷u þ: khi truy v¸t, º tr¡nh truy nhªp ra ngo i b£ng, n¶n t¤o vi·n cho b£ng.

program StrOpt;

const

OutputFile = 'XAU.OUT'; max = 100;

var

X, Y: String[2 * max];

F: array[-1..max, -1..max] of Integer; m, n: Integer; procedure Enter; var fi: Text; begin Assign(fi, InputFile);

Reset(fi); ReadLn(fi, X); ReadLn(fi, Y); Close(fi); m := Length(X);

n := Length(Y); end;

function Min3(x, y, z: Integer): Integer; var t: Integer; begin if x < y then t := x else t := y; if z < t then t := z; Min3 := t; end; procedure Optimize; var i, j: Integer; begin

for i := 0 to m do F[i, -1] := max +1; for j := 0 to n do F[-1, j] := max + 1;

for i := 1 to m do for j := 1 to n do

if X[i] = Y[j] then F[i, j] := F[i - 1, j - 1]

else F[i, j] := Min3(F[i, j - 1], F[i - 1, j - 1], F[i - 1, j]) + 1; end; procedure Trace; var fo: Text; begin Assign(fo, OutputFile); Rewrite(fo); WriteLn(fo, F[m, n]); while (m <> 0) or (n <> 0) do if X[m] = Y[n] then begin Dec(m); Dec(n); end else begin Write(fo, X, ' -> '); if F[m, n] = F[m, n - 1] + 1 then begin

Write(fo, 'Insert(', m, ', ', Y[n], ')'); Insert(Y[n], X, m + 1); Dec(n);

end

else

if F[m, n] = F[m - 1, n - 1] + 1 then begin

Write(fo, 'Replace(', m, ', ', Y[n], ')'); X[m] := Y[n]; Dec(m); Dec(n);

end

begin Write(fo, 'Delete(', m, ')'); Delete(X, m, 1); Dec(m); end; WriteLn(fo, ' -> ', X); end; Close(fo); end; begin Enter; Optimize; Trace; end.

2.3 B i to¡n c¡i tói

B i to¡n: Mët cûa h ng b¡n ç trang sùc câ n mân h ng (n ≤ 100), mân h ng thù i câ trång l÷ñng l  W[i] ≤ 100 v  trà gi¡ V[i] ≤ 100

(sè nguy¶n). Mët t¶n trëm mang theo mët chi¸c tói câ thº üng ÷ñc tèi a trång l÷ñng M ( M ≤ 100). Häi t¶n trëm â s³ l§y nhúng mân h ng n o º ÷ñc têng gi¡ trà lîn nh§t. Bi¸t r¬ng méi mân ch¿ ÷ñc chån ho°c khæng chån.

Input: file v«n b£n BIGBAG.INP

. Dáng 1: Chùa hai sè n, M c¡ch nhau ½t nh§t mët d§u c¡ch.

. n dáng ti¸p theo, dáng thù i chùa hai sè nguy¶n d÷ìng W[i], V[i] c¡ch nhau ½t nh§t mët d§u c¡ch.

Output: file v«n b£n BIGBAG.OUT

. Dáng 1 : Ghi gi¡ trà lîn nh§t t¶n trëm câ thº l§y.

. Dáng 2 : Ghi ch¿ sè nhúng bà l§y.

H¼nh 2.8:

C¡ch gi£i: N¸u gåi F[i, j] l  gi¡ trà lîn nh§t câ thº câ b¬ng c¡ch chån trong c¡c gâi 1,2, . . . , i vîi giîi h¤n trång l÷ñng j. Th¼ gi¡ trà lîn nh§t khi ÷ñc chån trong sè n gâi vîi giîi h¤n trång l÷ñng M ch½nh l 

F[n, M]. V½ dö F[4,10] = 8, ngh¾a l  trong tr÷íng hñp tèi ÷u têng gi¡ trà cõa c¡c mân h ng ÷ñc chån l  8, khi câ 4 mân ¦u ti¶n ÷ñc chån (tø mân 1 ¸n mân 4) v  khèi l÷ñng tèi a cõa tói l  10.

Cæng thùc truy hçi t½nh F[i, j]: Vîi giîi h¤n trång l÷ñng j, vi»c chån tèi ÷u trong sè c¡c gâi 1,2, . . . , i−1, i º câ gi¡ trà lîn nh§t s³ câ hai kh£ n«ng:

∗ N¸u khæng chån gâi thù i th¼ F[i, j] l  gi¡ trà lîn nh§t câ thº b¬ng c¡ch chån trong sè c¡c gâi 1,2, . . . , i−1 vîi giîi h¤n trång l÷ñng l  j. Tùc l 

F[i, j] = F[i−1, j]

∗ N¸u câ chån gâi thù i (t§t nhi¶n ch¿ x²t tîi tr÷íng hñp n y khi m  W[i] ≤ j) th¼ F[i, j] b¬ng gi¡ trà gâi thù i l  V[i] cëng vîi gi¡ trà lîn nh§t câ thº câ ÷ñc b¬ng c¡ch chån trong sè c¡c gâi

1,2, . . . , i−1 vîi giîi h¤n trång l÷ñng j −W[i]. Tùc l  v· m°t gi¡ trà thu ÷ñc:

F[i, j] = V[i] +F[i−1, j−W[i]] V¼ theo c¡ch x¥y düng F[i, j] l  gi¡ trà lîn nh§t câ thº, n¶n F[i, j] s³ l  max trong 2 gi¡ trà thu ÷ñc ð tr¶n.

Cì sð quy ho¤ch ëng: D¹ th§y F[0, j] = 0, gi¡ trà lîn nh§t câ thº b¬ng c¡ch chån trong sè 0 gâi.

T½nh b£ng ph÷ìng ¡n: B£ng ph÷ìng ¡n F gçm n+ 1 dáng, M + 1

cët, tr÷îc ti¶n ÷ñc i·n cì sð quy ho¤ch ëng: Dáng 0 gçm to n sè 0. Sû döng cæng thùc truy hçi, dòng dáng 0 t½nh dáng 1, dòng dáng 1 t½nh dáng 2, v.v. . . ¸n khi t½nh h¸t dáng n.

Truy v¸t: T½nh xong b£ng ph÷ìng ¡n th¼ ta quan t¥m ¸n F[n, M]

â ch½nh l  gi¡ trà lîn nh§t thu ÷ñc khi chån trong c£ n gâi vîi giîi h¤n trång l÷ñng M. N¸u F[n, M] = F[n−1, M] th¼ tùc l  khæng chån gâi thù n, ta truy ti¸p F[n−1, M]. Cán n¸u F[n, M] 6= F[n−1, M]

th¼ ta thæng b¡o r¬ng ph²p chån tèi ÷u câ chån gâi thù n v  truy ti¸p

F[n−1, M −W[n]]. Cù ti¸p töc cho tîi khi truy l¶n tîi h ng 0 cõa b£ng ph÷ìng ¡n.

H¼nh 2.9:

program Lucky_Bag;

const

InputFile = 'BIGBAG.INP';

OutputFile = 'BIGBAG.OUT'; max = 100; var

W, V: Array[1..max] of Integer; F: array[0..max, 0..max] of Integer; n, M: Integer; procedure Enter; var i: Integer; fi: Text; begin Assign(fi, InputFile); Reset(fi); ReadLn(fi, n, M);

for i := 1 to n do ReadLn(fi, W[i], V[i]); Close(fi);

end;

procedure Optimize; var

i, j: Integer; begin FillChar(F[0], SizeOf(F[0]), 0); for i := 1 to n do for j := 0 to M do begin F[i, j] := F[i - 1, j];

if (j >= W[i]) and (F[i, j] < F[i - 1, j - W[i]] + V[i]) then F[i, j] := F[i - 1, j - W[i]] + V[i];

end; end; procedure Trace; var fo: Text; begin

Assign(fo, OutputFile); Rewrite(fo); WriteLn(fo, F[n, M]); while n <> 0 do begin if F[n, M] <> F[n - 1, M] then begin Write(fo, n, ' '); M := M - W[n]; end; Dec(n); end; Close(fo); end; begin

Enter; Optimize; Trace; end.

K˜T LUŠN

Khâa luªn t¼m hiºu v· ph÷ìng ph¡p quy ho¤ch ëng v  sû döng º gi£i b i to¡n tèi ÷u. K¸t qu£ ch½nh ¤t ÷ñc Khâa luªn l :

1. Tr¼nh b y c¡c ki¸n thùc cì b£n v· » quy (cæng thùc truy hçi, c i °t » quy, mët sè b i to¡n mang b£n ch§t » quy), b i to¡n tèi ÷u v  ph÷ìng ph¡p quy ho¤ch ëng.

2. Tr¼nh b y v· gi£i mët sè b i to¡n sû döng ph÷ìng ph¡p quy ho¤ch ëng cì b£n: D¢y con ìn i»u t«ng d i nh§t, B i to¡n c¡i tói, Bi¸n êi x¥u.

V¼ thíi gian câ h¤n n¶n trong Khâa luªn khæng tr¡nh khäi sai sât. Em r§t mong nhªn sü âng gâp, þ ki¸n cõa c¡c th¦y cæ gi¡o v  c¡c b¤n º khâa luªn ÷ñc ho n thi»n.

[1] Hç S¾  m(Chõ bi¶n, 2000), Mët sè ph÷ìng ph¡p gi£i b i to¡n trong tin håc, NXB Giaâ döc.

[2] L¶ Minh Ho ng (2014), Gi£i thuªt v  lªp tr¼nh, Book online [3] Nguy¹n Quþ Khang, Ki·u V«n H÷ng (2002), B i tªp Pascal (tªp

2), NXB ¤i håc Quèc gia H  Nëi.

[4] Robert Sedgewick (2004), C©m nang thuªt to¡n (tªp 1), NXB Khoa håc Kÿ thuªt

[5] Nguy¹n ùc Ngh¾a, Nguy¹n Tæ Th nh(2006), To¡n ríi r¤c, NXB NXB ¤i håc Quèc gia H  Nëi.

Một phần của tài liệu Phương pháp quy hoạch động giải một số bài toán tối ưu (Trang 28)

Tải bản đầy đủ (PDF)

(46 trang)